#include<iostream>
using namespace std;
class Solution {
public:
    bool isequal(int cnt1[126],int cnt2[126])
    {
        for(int i = 'a';i<='z';i++)
        {
            if(cnt1[i]>cnt2[i])
            {
                return false;//不符合涵盖的条件
            }
        }
        for(int i = 'A';i<='Z';i++)
        {
            if(cnt1[i]>cnt2[i])
            {
                return false;
            }
        }
        return true;
    }//这个函数的目的就是为了判断此时s中的滑动窗口内的元素是否完全涵盖了t
    string minWindow(string s, string t) {
        int cnt1[128];
        int cnt2[128];
        for(int i = 0;i<t.size();i++)
        {
            cnt1[t[i]]++;
        }
        int left = 0;
        int right = 0;
        int ret_left = -1;//记录最小区间的做左端点，这里等于-1是为了判断没有答案的情况
        int ret_right = s.size();//记录最小区间的右端点，这里先让这个区间变成最大，方便更新答案
        while(right<s.size())
        {
            //进窗口
            cnt2[s[right]]++;
            //满足覆盖率
            while(isequal(cnt1,cnt2))
            {
                //此时满足了覆盖的条件
                if(right-left<ret_right-ret_left)
                {
                    //说明此时的区间长度更加的小,记录最小的区间
                    ret_right = right;
                    ret_left = left;
                }
                //出窗口
                cnt2[s[left]]--;
                left++;
            }
            right++;
        }
        return ret_left < 0?"":s.substr(ret_left,ret_right-ret_left+1);
    }
};